; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s
; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s
; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff -mcpu=pwr8 -vec-extabi < %s | FileCheck %s

define zeroext i32 @ReverseBits(i32 zeroext %n) {
; CHECK-LABEL: ReverseBits:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lis 4, -21846
; CHECK-NEXT:    lis 5, 21845
; CHECK-NEXT:    slwi 6, 3, 1
; CHECK-NEXT:    srwi 3, 3, 1
; CHECK-NEXT:    ori 4, 4, 43690
; CHECK-NEXT:    ori 5, 5, 21845
; CHECK-NEXT:    and 4, 6, 4
; CHECK-NEXT:    and 3, 3, 5
; CHECK-NEXT:    lis 5, 13107
; CHECK-NEXT:    or 3, 3, 4
; CHECK-NEXT:    lis 4, -13108
; CHECK-NEXT:    ori 5, 5, 13107
; CHECK-NEXT:    slwi 6, 3, 2
; CHECK-NEXT:    ori 4, 4, 52428
; CHECK-NEXT:    srwi 3, 3, 2
; CHECK-NEXT:    and 4, 6, 4
; CHECK-NEXT:    and 3, 3, 5
; CHECK-NEXT:    lis 5, 3855
; CHECK-NEXT:    or 3, 3, 4
; CHECK-NEXT:    lis 4, -3856
; CHECK-NEXT:    ori 5, 5, 3855
; CHECK-NEXT:    slwi 6, 3, 4
; CHECK-NEXT:    ori 4, 4, 61680
; CHECK-NEXT:    srwi 3, 3, 4
; CHECK-NEXT:    and 4, 6, 4
; CHECK-NEXT:    and 3, 3, 5
; CHECK-NEXT:    or 3, 3, 4
; CHECK-NEXT:    rotlwi 4, 3, 24
; CHECK-NEXT:    rlwimi 4, 3, 8, 8, 15
; CHECK-NEXT:    rlwimi 4, 3, 8, 24, 31
; CHECK-NEXT:    rldicl 3, 4, 0, 32
; CHECK-NEXT:    clrldi 3, 3, 32
; CHECK-NEXT:    blr
entry:
  %shr = lshr i32 %n, 1
  %and = and i32 %shr, 1431655765
  %and1 = shl i32 %n, 1
  %shl = and i32 %and1, -1431655766
  %or = or i32 %and, %shl
  %shr2 = lshr i32 %or, 2
  %and3 = and i32 %shr2, 858993459
  %and4 = shl i32 %or, 2
  %shl5 = and i32 %and4, -858993460
  %or6 = or i32 %and3, %shl5
  %shr7 = lshr i32 %or6, 4
  %and8 = and i32 %shr7, 252645135
  %and9 = shl i32 %or6, 4
  %shl10 = and i32 %and9, -252645136
  %or11 = or i32 %and8, %shl10
  %shr13 = lshr i32 %or11, 24
  %and14 = lshr i32 %or11, 8
  %shr15 = and i32 %and14, 65280
  %and17 = shl i32 %or11, 8
  %shl18 = and i32 %and17, 16711680
  %shl21 = shl i32 %or11, 24
  %or16 = or i32 %shl21, %shr13
  %or19 = or i32 %or16, %shr15
  %or22 = or i32 %or19, %shl18
  ret i32 %or22
}

define i64 @ReverseBits64(i64 %n) {
; CHECK-LABEL: ReverseBits64:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lis 4, -21846
; CHECK-NEXT:    lis 5, 21845
; CHECK-NEXT:    lis 7, -13108
; CHECK-NEXT:    lis 8, 13107
; CHECK-NEXT:    ori 4, 4, 43690
; CHECK-NEXT:    ori 5, 5, 21845
; CHECK-NEXT:    ori 7, 7, 52428
; CHECK-NEXT:    ori 8, 8, 13107
; CHECK-NEXT:    sldi 4, 4, 32
; CHECK-NEXT:    sldi 5, 5, 32
; CHECK-NEXT:    oris 4, 4, 43690
; CHECK-NEXT:    oris 5, 5, 21845
; CHECK-NEXT:    sldi 6, 3, 1
; CHECK-NEXT:    rldicl 3, 3, 63, 1
; CHECK-NEXT:    ori 4, 4, 43690
; CHECK-NEXT:    ori 5, 5, 21845
; CHECK-NEXT:    sldi 7, 7, 32
; CHECK-NEXT:    sldi 8, 8, 32
; CHECK-NEXT:    and 4, 6, 4
; CHECK-NEXT:    and 3, 3, 5
; CHECK-NEXT:    lis 5, -3856
; CHECK-NEXT:    oris 6, 7, 52428
; CHECK-NEXT:    oris 7, 8, 13107
; CHECK-NEXT:    or 3, 3, 4
; CHECK-NEXT:    lis 4, 3855
; CHECK-NEXT:    ori 5, 5, 61680
; CHECK-NEXT:    ori 6, 6, 52428
; CHECK-NEXT:    ori 7, 7, 13107
; CHECK-NEXT:    ori 4, 4, 3855
; CHECK-NEXT:    sldi 8, 3, 2
; CHECK-NEXT:    rldicl 3, 3, 62, 2
; CHECK-NEXT:    and 6, 8, 6
; CHECK-NEXT:    and 3, 3, 7
; CHECK-NEXT:    sldi 5, 5, 32
; CHECK-NEXT:    sldi 4, 4, 32
; CHECK-NEXT:    or 3, 3, 6
; CHECK-NEXT:    oris 5, 5, 61680
; CHECK-NEXT:    oris 4, 4, 3855
; CHECK-NEXT:    sldi 6, 3, 4
; CHECK-NEXT:    ori 5, 5, 61680
; CHECK-NEXT:    ori 4, 4, 3855
; CHECK-NEXT:    rldicl 3, 3, 60, 4
; CHECK-NEXT:    and 5, 6, 5
; CHECK-NEXT:    and 3, 3, 4
; CHECK-NEXT:    or 3, 3, 5
; CHECK-NEXT:    rldicl 4, 3, 32, 32
; CHECK-NEXT:    rotlwi 5, 3, 24
; CHECK-NEXT:    rotlwi 6, 4, 24
; CHECK-NEXT:    rlwimi 5, 3, 8, 8, 15
; CHECK-NEXT:    rlwimi 5, 3, 8, 24, 31
; CHECK-NEXT:    rlwimi 6, 4, 8, 8, 15
; CHECK-NEXT:    rlwimi 6, 4, 8, 24, 31
; CHECK-NEXT:    sldi 3, 5, 32
; CHECK-NEXT:    or 3, 3, 6
; CHECK-NEXT:    blr
entry:
  %shr = lshr i64 %n, 1
  %and = and i64 %shr, 6148914691236517205
  %and1 = shl i64 %n, 1
  %shl = and i64 %and1, -6148914691236517206
  %or = or i64 %and, %shl
  %shr2 = lshr i64 %or, 2
  %and3 = and i64 %shr2, 3689348814741910323
  %and4 = shl i64 %or, 2
  %shl5 = and i64 %and4, -3689348814741910324
  %or6 = or i64 %and3, %shl5
  %shr7 = lshr i64 %or6, 4
  %and8 = and i64 %shr7, 1085102592571150095
  %and9 = shl i64 %or6, 4
  %shl10 = and i64 %and9, -1085102592571150096
  %or11 = or i64 %and8, %shl10
  %shr13 = lshr i64 %or11, 56
  %and14 = lshr i64 %or11, 40
  %shr15 = and i64 %and14, 65280
  %and17 = lshr i64 %or11, 24
  %shr18 = and i64 %and17, 16711680
  %and20 = lshr i64 %or11, 8
  %shr21 = and i64 %and20, 4278190080
  %and23 = shl i64 %or11, 8
  %shl24 = and i64 %and23, 1095216660480
  %and26 = shl i64 %or11, 24
  %shl27 = and i64 %and26, 280375465082880
  %and29 = shl i64 %or11, 40
  %shl30 = and i64 %and29, 71776119061217280
  %shl33 = shl i64 %or11, 56
  %or16 = or i64 %shl33, %shr13
  %or19 = or i64 %or16, %shr15
  %or22 = or i64 %or19, %shr18
  %or25 = or i64 %or22, %shr21
  %or28 = or i64 %or25, %shl24
  %or31 = or i64 %or28, %shl27
  %or34 = or i64 %or31, %shl30
  ret i64 %or34
}
